{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3.1 多轮对话与上下文记忆\n",
    "前提：获取大模型"
   ],
   "id": "7dcf6961feebe6f4"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:08:16.403267Z",
     "start_time": "2025-10-21T01:08:03.910857Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "from langchain_openai import ChatOpenAI\n",
    "import dotenv\n",
    "dotenv.load_dotenv()\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "chat_model=ChatOpenAI(\n",
    "    model=\"qwen-max\",\n",
    "    temperature=0.7,\n",
    "    max_tokens=1024,\n",
    ")\n",
    "# 测试1\n",
    "from langchain_core.messages import SystemMessage, HumanMessage\n",
    "sys_message = SystemMessage(\n",
    "content=\"我是一个人工智能的助手，我的名字叫小智\",\n",
    ")\n",
    "human_message = HumanMessage(content=\"猫王是一只猫吗？\")\n",
    "messages = [sys_message, human_message]\n",
    "#调用大模型，传入messages\n",
    "response = chat_model.invoke(messages)\n",
    "print(response.content)\n",
    "# 猫王不是猫，是..\n",
    "response1 = chat_model.invoke(\"你叫什么名字？\")\n",
    "print(response1.content) # Qwen"
   ],
   "id": "76a181663318e857",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不是的，\"猫王\"通常指的是美国著名的摇滚乐歌手埃尔维斯·普雷斯利（Elvis Presley），他因为其独特的音乐风格和舞台表演而被人们称为“猫王”。这个名字并不是指他是一只猫，而是他的绰号。在中文里，“猫”有时也被用来形容一些人的性格或行为特点，但这并不意味着这些人真的是猫。\n",
      "我是Qwen，这是我的英文名，我的中文名叫通义千问。我是阿里云自主研发的超大规模语言模型，能够回答问题、创作文字，还能表达观点、撰写代码等。如果您有任何问题或需要帮助，请随时告诉我，我会尽力提供支持。\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:10:21.583624Z",
     "start_time": "2025-10-21T01:10:15.832105Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 测试二\n",
    "from langchain_core.messages import SystemMessage, HumanMessage\n",
    "sys_message = SystemMessage(\n",
    "content=\"我是一个人工智能的助手，我的名字叫小智\",\n",
    ")\n",
    "human_message = HumanMessage(content=\"猫王是一只猫吗？\")\n",
    "human_message1 = HumanMessage(content=\"你叫什么名字？\")\n",
    "messages = [sys_message, human_message,human_message1]\n",
    "#调用大模型，传入messages\n",
    "response = chat_model.invoke(messages)\n",
    "print(response.content)"
   ],
   "id": "f4fdbca572e9943c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "您好，我叫小智，是一个人工智能助手。关于您的问题，“猫王”并不是指一只猫，而是美国著名摇滚歌手埃尔维斯·普雷斯利（Elvis Presley）的昵称。他因为对摇滚乐的贡献以及其独特的表演风格而被人们称为“猫王”。\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:12:15.121438Z",
     "start_time": "2025-10-21T01:12:08.026766Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 测试三\n",
    "from langchain_core.messages import SystemMessage, HumanMessage\n",
    "sys_message = SystemMessage(\n",
    "content=\"我是一个人工智能的助手，我的名字叫小智\",\n",
    ")\n",
    "human_message = HumanMessage(content=\"猫王是一只猫吗？\")\n",
    "sys_message1 = SystemMessage(\n",
    "content=\"我可以做很多事情，有需要就找我吧\",\n",
    ")\n",
    "human_message1 = HumanMessage(content=\"你叫什么名字？\")\n",
    "messages = [sys_message, human_message,sys_message1,human_message1]\n",
    "#调用大模型，传入messages\n",
    "response = chat_model.invoke(messages)\n",
    "print(response.content)"
   ],
   "id": "711629264c18cc7d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "您好，看起来您的问题有点混淆了。猫王并不是一只猫，而是美国摇滚乐歌手埃尔维斯·普雷斯利的昵称。他因为在音乐界的巨大影响力而被人们尊称为“摇滚之王”，简称“猫王”。\n",
      "\n",
      "另外，您提到我可以做很多事情，有需要就找我吧，这听起来像是我的台词呢！我是小智，一个能够提供帮助的人工智能助手。如果您有任何问题或需要什么帮助，请随时告诉我哦！\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:13:56.017852Z",
     "start_time": "2025-10-21T01:13:48.707718Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 测试五\n",
    "from langchain_core.messages import SystemMessage, HumanMessage\n",
    "\n",
    "# 第1组\n",
    "sys_message = SystemMessage(\n",
    "    content=\"我是一个人工智能的助手，我的名字叫小智\",\n",
    ")\n",
    "human_message = HumanMessage(content=\"猫王是一只猫吗？\")\n",
    "messages = [sys_message, human_message]\n",
    "# 第2组\n",
    "sys_message1 = SystemMessage(\n",
    "    content=\"我可以做很多事情，有需要就找我吧\",\n",
    ")\n",
    "human_message1 = HumanMessage(content=\"你叫什么名字？\")\n",
    "messages1 = [sys_message1, human_message1]\n",
    "#调用大模型，传入messages\n",
    "response = chat_model.invoke(messages)\n",
    "print(response.content)\n",
    "response = chat_model.invoke(messages1)\n",
    "print(response.content)"
   ],
   "id": "bd83d6ec28b6ed14",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不是的，猫王并不是指一只猫，而是指美国著名的摇滚歌手埃尔维斯·普雷斯利（Elvis Presley）。他因为其独特的音乐风格和个人魅力，在音乐界有着非常高的地位，因此被人们称为“猫王”。这里的“猫”是对他的昵称，并不是指真的猫。\n",
      "我是来自阿里云的超大规模语言模型，我叫通义千问。\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:16:56.705695Z",
     "start_time": "2025-10-21T01:16:55.347656Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 测试五\n",
    "from langchain_core.messages import SystemMessage, HumanMessage, AIMessage\n",
    "\n",
    "messages = [\n",
    "    SystemMessage(content=\"我是一个人工智能助手，我的名字叫小智\"),\n",
    "    HumanMessage(content=\"人工智能英文怎么说？\"),\n",
    "    AIMessage(content=\"AI\"),\n",
    "    HumanMessage(content=\"你叫什么名字\"),\n",
    "]\n",
    "messages1 = [\n",
    "    SystemMessage(content=\"我是一个人工智能助手，我的名字叫小智\"),\n",
    "    HumanMessage(content=\"很高兴认识你\"),\n",
    "    AIMessage(content=\"我也很高兴认识你\"),\n",
    "    HumanMessage(content=\"你叫什么名字\"),\n",
    "]\n",
    "messages2 = [\n",
    "    SystemMessage(content=\"我是一个人工智能助手，我的名字叫小智\"),\n",
    "    HumanMessage(content=\"人工智能英文怎么说？\"),\n",
    "    AIMessage(content=\"AI\"),\n",
    "    HumanMessage(content=\"你叫什么名字\"),\n",
    "]\n",
    "chat_model.invoke(messages2)"
   ],
   "id": "e3e99196511c307d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "AIMessage(content='我是小智，您的智能助手。有什么我可以帮您的吗？', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 14, 'prompt_tokens': 42, 'total_tokens': 56, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-max', 'system_fingerprint': None, 'id': 'chatcmpl-2feb52b3-88ed-4f28-8b0d-d9338e6cde62', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--9e676d25-4f43-4df8-a120-7c47ab32d5f5-0', usage_metadata={'input_tokens': 42, 'output_tokens': 14, 'total_tokens': 56, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3.模型调用的方法\n",
    "举例1：invoke单条非流式调用(默认)"
   ],
   "id": "5401c65a3c7edf60"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:32:00.121606Z",
     "start_time": "2025-10-21T01:31:52.728442Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 创建消息\n",
    "messages = [HumanMessage(content=\"你好，请介绍一下自己\")]\n",
    "# 非流式调用LLM获取响应\n",
    "response = chat_model.invoke(messages)\n",
    "# 打印响应内容\n",
    "print(response)"
   ],
   "id": "488c2069bbd47bbc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "content='你好！我是Qwen，由阿里云研发的超大规模语言模型。我被设计用来帮助用户生成各种类型的文本，比如文章、故事、诗歌、故事等，并且能够根据不同的场景和需求提供多样的回答。无论是知识性的问答、创作上的辅助还是日常对话交流，我都力求给出最恰当、最有用的回答。同时，我也在不断学习和进步中，希望可以更好地服务于每一位用户。如果你有任何问题或需要帮助的地方，欢迎随时向我提问！' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 103, 'prompt_tokens': 12, 'total_tokens': 115, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-max', 'system_fingerprint': None, 'id': 'chatcmpl-61b53714-d8ed-48c0-940f-e1e7be8b6663', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None} id='run--dd985ecf-0253-45da-ba83-d6317623a629-0' usage_metadata={'input_tokens': 12, 'output_tokens': 103, 'total_tokens': 115, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}\n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "举例2：多个消息输入",
   "id": "78199be190e8a994"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:34:44.149773Z",
     "start_time": "2025-10-21T01:34:42.270080Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 支持多个消息作为输入\n",
    "messages = [\n",
    "    SystemMessage(content=\"你是一位乐于助人的助手。你叫Jacky老师\"),\n",
    "    HumanMessage(content=\"你是谁？\")\n",
    "]\n",
    "response = chat_model.invoke(messages)\n",
    "print(response.content)"
   ],
   "id": "1e971436313f64fa",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "你好，我是Jacky老师，你的乐于助人的助手。有什么我可以帮到你的吗？\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3.2 流式输出\n",
    "一种更具交互感的模型输出方式，用户不再需要等待完整答案，能看到模型逐个 token 地实时返回内容。\n",
    "适合构建强调“实时反馈”的应用，如聊天机器人、写作助手等。"
   ],
   "id": "11251cb22adf7830"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:45:01.075398Z",
     "start_time": "2025-10-21T01:44:53.333874Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 初始化大模型\n",
    "chat_model = ChatOpenAI(model=\"qwen-max\",\n",
    "                        streaming=True  # 启用流式输出\n",
    "                        )\n",
    "# 创建消息\n",
    "messages = [HumanMessage(content=\"你好，请介绍一下自己\")]\n",
    "# 流式调用LLM获取响应\n",
    "print('=' * 10 + \"开始流式输出：\" + '=' * 10)\n",
    "for chunk in chat_model.stream(messages):  # 逐个打印内容块\n",
    "    print(chunk.content, end=\"\", flush=True)  # 刷新缓冲区 (无换行符，缓冲区未刷新，内容可能不会立即显示)\n",
    "print(\"\\n流式输出结束\")"
   ],
   "id": "45a762e8c53764a4",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==========开始流式输出：==========\n",
      "你好！我是Qwen，一个由阿里云开发的超大规模语言模型。我的设计目的是为了能够理解和生成接近人类水平的自然语言，以帮助用户提高创造力和生产力。无论是写故事、写公文、写邮件、写剧本，还是表达观点、玩游戏等，我都可以提供支持。此外，我还能够基于对文本的理解，与用户进行多轮次的对话交流。如果你有任何问题或需要帮助的地方，都欢迎随时向我提问！\n",
      "流式输出结束\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 3.3 批量调用",
   "id": "743ba56bb4088fe4"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T01:49:11.199541Z",
     "start_time": "2025-10-21T01:48:16.637106Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 初始化大模型\n",
    "chat_model = ChatOpenAI(model=\"deepseek-r1\")\n",
    "messages1 = [SystemMessage(content=\"你是一位乐于助人的智能小助手\"),\n",
    "HumanMessage(content=\"请帮我介绍一下什么是机器学习\"), ]\n",
    "messages2 = [SystemMessage(content=\"你是一位乐于助人的智能小助手\"),\n",
    "HumanMessage(content=\"请帮我介绍一下什么是AIGC\"), ]\n",
    "messages3 = [SystemMessage(content=\"你是一位乐于助人的智能小助手\"),\n",
    "HumanMessage(content=\"请帮我介绍一下什么是大模型技术\"), ]\n",
    "messages = [messages1, messages2, messages3]\n",
    "# 调用batch\n",
    "response = chat_model.batch(messages)\n",
    "print(response)"
   ],
   "id": "4d660ce5fcd0c2bc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[AIMessage(content='好的，没问题！机器学习是人工智能领域的一个核心分支，简单来说，就是：\\n\\n**让计算机像人类一样“学习”并“改进”的能力。**\\n\\n更具体一点：\\n\\n*   **传统编程：** 人类程序员需要明确地告诉计算机每一步该做什么（写具体的规则和指令）。\\n*   **机器学习：** 人类程序员不直接告诉计算机“如何做”，而是提供大量的**数据**和**目标**，让计算机自己从数据中**找出规律**、**构建模型**，从而学会**如何完成任务**或**做出预测**。\\n\\n**核心思想：从数据中学习，而不是被显式编程。**\\n\\n**关键要素：**\\n\\n1.  **数据：** 这是机器学习的“燃料”。数据的数量和质量直接影响到学习的效果。数据可以是文本、图像、音频、数字、传感器读数等等。\\n2.  **模型：** 可以理解为一个数学函数或算法框架。它代表了计算机从数据中学到的“知识”或“规律”。模型就像一个“黑箱”，输入数据进去，它会输出预测或决策。\\n3.  **学习算法：** 这是驱动“学习”过程的引擎。算法负责调整模型的内部参数，使得模型在给定的数据上表现得越来越好（比如预测更准确）。常见的算法包括线性回归、决策树、支持向量机、神经网络（尤其是深度学习）等。\\n4.  **目标/任务：** 机器学习是为了解决某个具体问题。常见的任务包括：\\n    *   **预测：** 预测未来（如股票价格、销售额）、预测类别（如邮件是否是垃圾邮件、图片中的物体是什么）。\\n    *   **识别：** 识别图像中的物体、识别人脸、识别语音。\\n    *   **分类：** 将数据划分到不同的类别（如将新闻分类到体育、财经等）。\\n    *   **聚类：** 发现数据中隐藏的自然分组（如将客户分成不同的群体）。\\n    *   **推荐：** 根据用户历史行为推荐商品、电影、音乐等。\\n    *   **决策：** 在复杂环境中做出最优决策（如自动驾驶、游戏AI）。\\n\\n**机器学习是如何“学习”的？**\\n\\n想象一下教孩子认识猫：\\n\\n1.  **提供数据：** 你给孩子看很多猫的图片（有各种品种、颜色、姿势）和一些非猫的图片（狗、兔子等）。\\n2.  **定义目标：** 你告诉孩子，目标是识别出哪些是猫。\\n3.  **学习过程：** 孩子的大脑（相当于模型）会观察这些图片，尝试找出猫的共同特征（尖耳朵、胡须、尾巴形状等）。一开始可能认错，但经过你不断纠正（相当于算法调整模型参数），孩子识别猫的能力会越来越强。\\n4.  **应用模型：** 当孩子看到一张新图片时，他就能运用学到的“模型”来判断这是不是猫。\\n\\n机器学习的过程非常类似：\\n\\n1.  **训练阶段：** 将大量的**训练数据**输入给学习算法。算法会不断调整模型的参数，使模型在训练数据上的输出（预测）尽可能接近真实结果（目标）。这个过程就是模型在“学习”数据中的模式和规律。\\n2.  **评估阶段：** 使用**验证数据**（训练时未用过的数据）来测试训练好的模型的表现，看看它是否真的学到了有用的规律，而不是死记硬背训练数据（过拟合）。\\n3.  **应用/预测阶段：** 将训练好并通过评估的模型部署到实际应用中。当有新的、未见过的数据输入时，模型就能根据之前学到的知识进行预测或决策。\\n\\n**机器学习的类型：**\\n\\n根据学习方式和任务目标，主要分为三类：\\n\\n1.  **监督学习：** 训练数据是**有标签**的。每个数据样本都明确标注了“正确答案”。目标是通过学习输入特征和输出标签之间的关系，来预测新数据的标签。\\n    *   *例子：* 预测房价（输入：房屋面积、位置等特征；输出：价格标签）、识别垃圾邮件（输入：邮件内容；输出：“垃圾”或“非垃圾”标签）。\\n2.  **无监督学习：** 训练数据是**没有标签**的。目标是发现数据中隐藏的结构、模式或分组。\\n    *   *例子：* 客户细分（根据购买行为等特征将客户分成不同群体）、主题建模（从大量文档中发现潜在主题）。\\n3.  **强化学习：** 模型（称为智能体）通过与**环境**互动来学习。它通过尝试不同的**动作**，根据环境反馈的**奖励**或**惩罚**来学习在特定情境下采取什么动作能获得最大的长期累积奖励。\\n    *   *例子：* 训练机器人走路、训练AI玩电子游戏（如AlphaGo）、自动驾驶决策。\\n\\n**为什么机器学习如此重要？**\\n\\n*   **处理海量复杂数据：** 在当今大数据时代，人类无法手动处理和分析所有数据。机器学习能高效地从海量、高维、复杂的数据中提取有价值的信息。\\n*   **解决传统编程难以解决的问题：** 很多任务（如图像识别、自然语言处理、预测复杂系统）很难甚至无法用明确的规则来编程实现，机器学习提供了解决方案。\\n*   **自动化决策与预测：** 可以自动化执行复杂的决策流程（如信贷审批、医疗诊断辅助）和预测任务（如需求预测、设备故障预测），提高效率和准确性。\\n*   **个性化体验：** 驱动了推荐系统、个性化广告、智能助手等，提供更贴合用户需求的体验。\\n*   **推动AI进步：** 是当前人工智能取得突破性进展（尤其是深度学习）的核心驱动力。\\n\\n**应用场景无处不在：**\\n\\n*   **互联网：** 搜索引擎、推荐系统（淘宝、抖音、Netflix）、广告投放、垃圾邮件过滤。\\n*   **金融：** 信用评分、欺诈检测、算法交易、风险管理。\\n*   **医疗：** 疾病诊断辅助、药物研发、医学影像分析、个性化治疗。\\n*   **零售：** 需求预测、库存管理、客户行为分析、精准营销。\\n*   **制造业：** 预测性维护、质量控制、供应链优化。\\n*   **交通：** 自动驾驶、路线规划、交通流量预测。\\n*   **安防：** 人脸识别、行为分析、异常检测。\\n*   **语音与语言：** 语音助手（Siri、小爱同学）、机器翻译、智能客服、情感分析。\\n\\n**简而言之，机器学习是赋予计算机从经验（数据）中学习的能力，从而在无需显式编程的情况下，就能完成特定任务或做出预测的一门科学和艺术。** 它正在深刻地改变我们生活和工作的方方面面。\\n\\n希望这个介绍能让你对机器学习有一个清晰的理解！如果你对某个具体方面（比如某种类型、某个算法或某个应用）感兴趣，可以随时再问我。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1755, 'prompt_tokens': 16, 'total_tokens': 1771, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'deepseek-r1', 'system_fingerprint': None, 'id': 'chatcmpl-69242883-7f41-4395-b571-4df48866306f', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--04cf3573-a33a-4e7c-837e-d80a342678d3-0', usage_metadata={'input_tokens': 16, 'output_tokens': 1755, 'total_tokens': 1771, 'input_token_details': {}, 'output_token_details': {}}), AIMessage(content='好的，没问题！AIGC 是当前科技领域非常热门的一个概念，我来为你详细介绍一下。\\n\\n**AIGC 是什么？**\\n\\nAIGC 是 **A**rtificial **I**ntelligence **G**enerated **C**ontent 的缩写，中文通常翻译为 **人工智能生成内容** 或 **生成式人工智能**。\\n\\n它的核心在于：**利用先进的人工智能技术，自动或半自动地创建全新的、有意义的数字内容。**\\n\\n**简单理解：**\\n\\n想象一下，你给一个非常聪明、博学且创造力非凡的AI助手一个指令（比如一段文字描述、一个关键词、一张草图、一段旋律），它就能根据你的要求，**从头开始生成**一段文字、一幅画、一首曲子、一段视频、甚至一段代码或一个3D模型。这个过程就是AIGC。\\n\\n**关键特点：**\\n\\n1.  **生成性：** AIGC的核心是“生成”（Generate），它创造的是**新的、原创的**内容，而不是简单地检索、复制或重组现有内容（虽然训练时会学习大量数据）。\\n2.  **内容多样性：** 生成的内容类型极其广泛，跨越多种媒介：\\n    *   **文本：** 文章、诗歌、代码、剧本、邮件、对话、营销文案、翻译等。\\n    *   **图像：** 绘画、照片、设计图、插画、图标等。\\n    *   **音频：** 音乐创作、语音合成（模仿人声）、音效设计等。\\n    *   **视频：** 动态图像合成、视频剪辑、特效生成、虚拟主播等。\\n    *   **多模态：** 结合多种形式，比如根据文字描述生成带语音解说的视频。\\n    *   **其他：** 3D模型、游戏场景、分子结构等。\\n3.  **模型驱动：** AIGC的实现依赖于强大的**生成式人工智能模型**。这些模型在海量数据上进行训练，学习数据中的模式、风格和规则。常见的模型类型包括：\\n    *   **大型语言模型：** 如 GPT 系列、文心一言、通义千问等，擅长文本生成和理解。\\n    *   **扩散模型：** 如 Stable Diffusion、DALL-E、Midjourney 等，擅长图像生成。\\n    *   **生成对抗网络：** 一种较早但仍有应用的生成模型架构。\\n4.  **人机协作：** AIGC通常需要人类的输入（提示词/Prompt）和引导。人类提供创意方向、要求和约束，AI负责执行具体的生成任务。输出的结果往往需要人类进行筛选、编辑和优化。这是一个协同创作的过程。\\n\\n**AIGC 是如何工作的？（简化版）**\\n\\n1.  **学习阶段：** AI模型在包含文本、图像、音频等的海量数据集上进行训练。它学习数据中的统计规律、语义关联、艺术风格、语法规则等。\\n2.  **输入阶段：** 用户提供“提示”。这可以是一个问题、一段描述、关键词、示例图片/音频，甚至是空白（让模型自由发挥）。\\n3.  **生成阶段：** 模型根据学到的知识和对提示的理解，预测并生成最符合要求的新内容。它是在“想象”和“创造”。\\n4.  **输出阶段：** 将生成的内容（文本、图像、音频等）呈现给用户。\\n5.  **迭代优化：** 用户根据输出结果，调整提示或参数，再次生成，直到得到满意的结果。\\n\\n**AIGC 的应用场景（非常广泛！）**\\n\\n*   **创意与艺术：** 快速生成插画、概念图、海报设计、音乐片段、诗歌小说灵感。\\n*   **内容创作：** 辅助撰写文章、博客、广告文案、社交媒体内容、视频脚本。\\n*   **设计与开发：** 生成产品原型图、UI设计稿、建筑设计草图、基础代码片段、游戏素材。\\n*   **教育与研究：** 创建个性化学习材料、模拟对话练习、生成研究报告草稿、辅助科学发现（如预测分子结构）。\\n*   **营销与广告：** 自动生成广告文案、个性化营销邮件、产品描述、虚拟模特/代言人。\\n*   **娱乐与媒体：** 开发虚拟偶像、生成电影特效、创建个性化游戏内容、合成语音旁白。\\n*   **客户服务：** 智能聊天机器人提供更自然流畅的对话。\\n*   **个人效率：** 辅助写作、做PPT、整理会议纪要、头脑风暴。\\n\\n**AIGC 的意义与影响：**\\n\\n*   **提升效率：** 极大加速内容创作过程，降低时间和人力成本。\\n*   **激发创意：** 提供新的灵感和可能性，突破人类固有的思维局限。\\n*   **降低门槛：** 让没有专业背景（如绘画、编程、作曲）的人也能进行创作。\\n*   **个性化：** 根据用户需求生成高度定制化的内容。\\n*   **推动创新：** 催生新的产品、服务和商业模式。\\n\\n**AIGC 面临的挑战与思考：**\\n\\n*   **版权与归属：** AI生成内容的版权归属（用户、平台、模型开发者？），训练数据中受版权保护作品的合法性。\\n*   **偏见与安全：** 模型可能放大训练数据中的偏见，生成有害、歧视性或虚假信息（深度伪造）。\\n*   **伦理问题：** 对创意工作者就业的影响，艺术价值的争议（AI创作算艺术吗？），信息真实性的挑战。\\n*   **质量控制：** 生成内容的质量参差不齐，需要人工审核和编辑。\\n*   **提示工程：** 如何有效地与AI沟通（写Prompt）以获得理想结果，本身成为一项技能。\\n\\n**总结：**\\n\\nAIGC 是利用人工智能技术自动生成各种形式数字内容的新范式。它基于强大的生成式AI模型，通过人机协作的方式，在文本、图像、音频、视频等领域展现出巨大的创造力和应用潜力。虽然它带来了效率提升和创意激发等革命性变化，但也伴随着版权、伦理、偏见、安全等方面的挑战，需要社会共同关注和规范。AIGC 正在深刻改变我们创作、工作和娱乐的方式，是未来数字化发展的重要方向之一。\\n\\n如果你想了解某个特定类型的AIGC（比如AI绘画、AI写作）或者具体的工具（比如ChatGPT, Midjourney），也可以继续问我！', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1594, 'prompt_tokens': 18, 'total_tokens': 1612, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'deepseek-r1', 'system_fingerprint': None, 'id': 'chatcmpl-68dceb6d-a092-4170-9889-02ea8f326de0', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--94ecdfe8-9864-4b0d-96d4-cfb8b66c56b6-0', usage_metadata={'input_tokens': 18, 'output_tokens': 1594, 'total_tokens': 1612, 'input_token_details': {}, 'output_token_details': {}}), AIMessage(content='好的，没问题！大模型技术是当前人工智能领域最热门、发展最迅猛的方向之一，它正在深刻地改变我们与技术互动的方式。简单来说：\\n\\n**大模型技术（Large Model Technology）** 指的是**训练具有海量参数（通常十亿甚至万亿级别）和超大规模数据集的深度学习模型**的技术。这些模型展现出强大的通用能力，能够理解和生成接近人类水平的文本、代码、图像、音频等多种形式的内容。\\n\\n我们可以从以下几个关键方面来理解大模型技术：\\n\\n1.  **“大”的核心要素：**\\n    *   **海量参数：** 模型内部的“可调节旋钮”数量巨大（数十亿、数百亿甚至上万亿）。参数越多，模型理论上能存储和学习的知识、模式就越复杂、越精细。\\n    *   **超大规模数据：** 训练数据通常来自互联网上的海量文本、代码、图像、视频等（如网页、书籍、论文、对话记录、开源代码库等）。数据量往往是TB甚至PB级别。\\n    *   **巨大的计算资源：** 训练这些模型需要强大的算力，通常由成千上万个高性能GPU或TPU集群并行运行数周甚至数月，消耗巨大的电力。\\n\\n2.  **核心技术基础：Transformer 架构**\\n    *   大模型，尤其是语言大模型（LLM）的核心驱动力是 **Transformer 架构**。这种架构在2017年被提出，特别擅长处理序列数据（如句子），通过“自注意力机制”有效地捕捉长距离依赖关系（理解句子中相距较远的词之间的关系）。\\n    *   Transformer 架构的可扩展性非常好，使得构建拥有海量参数的模型成为可能。\\n\\n3.  **核心训练范式：预训练 + 微调 / 提示工程**\\n    *   **预训练：** 这是最耗资源的一步。模型在无标签的、超大规模数据集上，通过自监督学习的方式（如预测下一个词、填充被掩盖的词）学习语言、图像等数据的通用模式、知识和世界常识。这相当于让模型“博览群书”。\\n    *   **微调：** 在预训练好的“通用”大模型基础上，使用特定领域、特定任务的有标签数据进行少量训练，使其适应具体任务（如情感分析、客服问答、医学报告生成）。\\n    *   **提示工程：** 无需额外训练，通过精心设计输入文本（提示词）来引导预训练好的大模型完成特定任务（如“将以下英文翻译成中文：...”，“总结这段文字：...”）。\\n\\n4.  **主要能力与特点：**\\n    *   **强大的语言理解与生成：** 流畅地写作、翻译、总结、问答、对话、创作诗歌故事等。\\n    *   **代码能力：** 生成、解释、调试代码。\\n    *   **多模态能力：** 新一代大模型（如GPT-4V, Gemini, Claude）不仅能处理文本，还能理解图像、音频（看图说话、图像描述、图像问答、语音识别与合成等）。\\n    *   **知识覆盖广泛：** 在预训练阶段吸收了海量信息，拥有广阔的知识面。\\n    *   **强大的上下文学习：** 仅通过几个示例（在提示词中给出），就能学会执行新任务。\\n    *   **推理能力初显：** 在复杂逻辑推理、数学解题等方面展现出潜力（尽管还不完美）。\\n    *   **涌现能力：** 当模型规模达到一定程度时，会“涌现”出在小模型中不存在的、意想不到的能力（如复杂推理、遵循复杂指令）。\\n\\n5.  **代表性例子：**\\n    *   **语言大模型：** OpenAI 的 GPT 系列（GPT-3, ChatGPT/GPT-3.5, GPT-4）、Google 的 PaLM/Gemini、Anthropic 的 Claude、Meta 的 LLaMA、中国的文心一言（ERNIE Bot）、通义千问、讯飞星火等。\\n    *   **多模态大模型：** OpenAI 的 GPT-4V（Vision）、Google 的 Gemini、Anthropic 的 Claude 3 Opus 等。\\n    *   **代码大模型：** OpenAI 的 Codex（驱动GitHub Copilot）、Anthropic 的 Claude 在代码方面也很强。\\n\\n6.  **应用场景广泛：**\\n    *   **智能助手：** 聊天机器人、客服、个人助理。\\n    *   **内容创作：** 自动撰写文章、营销文案、脚本、诗歌、音乐。\\n    *   **编程辅助：** 代码生成、补全、解释、调试。\\n    *   **信息检索与总结：** 高效搜索、提炼文档、生成报告摘要。\\n    *   **教育：** 个性化辅导、答疑、生成学习材料。\\n    *   **翻译：** 高质量、多语种互译。\\n    *   **创意设计：** 辅助生成设计草图、创意方案。\\n    *   **科学研究：** 文献分析、假设生成、数据解释。\\n\\n7.  **面临的挑战与问题：**\\n    *   **算力与成本：** 训练和部署成本极高，资源消耗巨大。\\n    *   **“幻觉”：** 模型会生成看似合理但事实上错误或编造的内容。\\n    *   **偏见与有害内容：** 模型可能放大训练数据中存在的偏见或生成不当、有害的内容。\\n    *   **可解释性差：** 模型内部决策过程如同“黑箱”，难以理解其推理路径。\\n    *   **安全与伦理：** 滥用风险（如生成虚假信息、深度伪造）、隐私泄露、版权问题等。\\n    *   **知识更新：** 模型训练完成后，其知识可能很快过时，需要持续更新。\\n\\n**总结来说：**\\n\\n**大模型技术是利用海量数据和计算资源，训练具有巨量参数的深度学习模型（尤其基于Transformer架构）的技术。它通过预训练学习通用知识和能力，再通过微调或提示工程应用于具体任务，展现出强大的语言理解与生成、代码能力、多模态处理以及初步的推理能力，正在广泛应用于各个领域，是当前人工智能发展的核心驱动力，但也面临成本、幻觉、偏见、安全等重大挑战。**\\n\\n希望这个介绍能帮助你理解大模型技术的基本概念！如果你想深入了解某个具体方面（比如Transformer原理、某个具体模型、应用案例等），随时可以再问我。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1628, 'prompt_tokens': 18, 'total_tokens': 1646, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'deepseek-r1', 'system_fingerprint': None, 'id': 'chatcmpl-3506a71a-0e01-42ca-a393-728aff872163', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--a1af41fd-e249-4ed1-a28d-0015df4760e1-0', usage_metadata={'input_tokens': 18, 'output_tokens': 1628, 'total_tokens': 1646, 'input_token_details': {}, 'output_token_details': {}})]\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3.3.3 同步调用与异步调用(了解)\n",
    "异步调用，允许程序在等待某些操作完成时继续执行其他任务，而不是阻塞等待。\n",
    "这在处理I/O操作（如网络请求、文件读写等）时特别有用，可以显著提高程序的效率和响应性。"
   ],
   "id": "5fd5e47bb42a06b8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-21T02:03:22.612326Z",
     "start_time": "2025-10-21T02:03:17.576846Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import asyncio\n",
    "import time\n",
    "\n",
    "async def async_call(llm):\n",
    "    await asyncio.sleep(5)  # 模拟异步操作\n",
    "    print(\"异步调用完成\")\n",
    "\n",
    "async def perform_other_tasks():\n",
    "    await asyncio.sleep(5)  # 模拟异步操作\n",
    "    print(\"其他任务完成\")\n",
    "\n",
    "async def run_async_tasks():\n",
    "    start_time = time.time()\n",
    "    await asyncio.gather(\n",
    "        async_call(None),  # 示例调用，使用None模拟LLM对象\n",
    "        perform_other_tasks()\n",
    "    )\n",
    "    end_time = time.time()\n",
    "    return f\"总共耗时：{end_time - start_time}秒\"\n",
    "# # 正确运行异步任务的方式\n",
    "# if __name__ == \"__main__\":\n",
    "# # 使用 asyncio.run() 来启动异步程序\n",
    "# result = asyncio.run(run_async_tasks())\n",
    "# print(result)\n",
    "# 在 Jupyter 单元格中直接调用\n",
    "result = await run_async_tasks()\n",
    "print(result)"
   ],
   "id": "55cef017001ee5f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "异步调用完成\n",
      "其他任务完成\n",
      "总共耗时：5.0147857666015625秒\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-22T01:15:21.783634Z",
     "start_time": "2025-10-22T01:14:56.852403Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import asyncio\n",
    "import os\n",
    "import time\n",
    "import dotenv\n",
    "from langchain_core.messages import HumanMessage, SystemMessage\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "# 初始化大模型\n",
    "chat_model = ChatOpenAI(model=\"qwen-max\")\n",
    "\n",
    "\n",
    "# 同步调用（对比组）\n",
    "def sync_test():\n",
    "    messages1 = [SystemMessage(content=\"你是一位乐于助人的智能小助手\"),\n",
    "                 HumanMessage(content=\"请帮我介绍一下什么是机器学习\"), ]\n",
    "    start_time = time.time()\n",
    "    response = chat_model.invoke(messages1)  # 同步调用\n",
    "    duration = time.time() - start_time\n",
    "    print(f\"同步调用耗时：{duration:.2f}秒\")\n",
    "    return response, duration\n",
    "\n",
    "\n",
    "# 异步调用（实验组）\n",
    "async def async_test():\n",
    "    messages1 = [SystemMessage(content=\"你是一位乐于助人的智能小助手\"),\n",
    "                 HumanMessage(content=\"请帮我介绍一下什么是机器学习\"), ]\n",
    "    start_time = time.time()\n",
    "    response = await chat_model.ainvoke(messages1)  # 异步调用\n",
    "    duration = time.time() - start_time\n",
    "    print(f\"异步调用耗时：{duration:.2f}秒\")\n",
    "    return response, duration\n",
    "# 运行测试\n",
    "if __name__ == \"__main__\":\n",
    "    # 运行同步测试\n",
    "    sync_response, sync_duration = sync_test()\n",
    "    print(f\"同步响应内容: {sync_response.content[:100]}...\\n\")\n",
    "# 运行异步测试\n",
    "async_response, async_duration = asyncio.run(async_test())\n",
    "print(f\"异步响应内容: {async_response.content[:100]}...\\n\")\n",
    "# 并发测试 - 修复版本\n",
    "print(\"\\n=== 并发测试 ===\")\n",
    "start_time = time.time()\n",
    "async def run_concurrent_tests():\n",
    "# 创建3个异步任务\n",
    "    tasks = [async_test() for _ in range(3)]\n",
    "# 并发执行所有任务\n",
    "    return await asyncio.gather(*tasks)\n",
    "# 执行并发测试\n",
    "results = asyncio.run(run_concurrent_tests())\n",
    "total_time = time.time() - start_time\n",
    "print(f\"\\n3个并发异步调用总耗时: {total_time:.2f}秒\")\n",
    "print(f\"平均每个调用耗时: {total_time / 3:.2f}秒\")"
   ],
   "id": "3a2b3fce9804022c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "同步调用耗时：24.84秒\n",
      "同步响应内容: 机器学习是人工智能（AI）的一个分支，它使计算机系统能够通过经验自动改进和适应。具体来说，机器学习关注的是开发算法和技术，这些算法和技术允许软件应用程序变得更加准确地预测结果或执行任务，而无需人类明确...\n",
      "\n"
     ]
    },
    {
     "ename": "RuntimeError",
     "evalue": "asyncio.run() cannot be called from a running event loop",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mRuntimeError\u001B[0m                              Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[5], line 41\u001B[0m\n\u001B[0;32m     39\u001B[0m     \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m同步响应内容: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00msync_response\u001B[38;5;241m.\u001B[39mcontent[:\u001B[38;5;241m100\u001B[39m]\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m...\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m     40\u001B[0m \u001B[38;5;66;03m# 运行异步测试\u001B[39;00m\n\u001B[1;32m---> 41\u001B[0m async_response, async_duration \u001B[38;5;241m=\u001B[39m \u001B[43masyncio\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43masync_test\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m     42\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m异步响应内容: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00masync_response\u001B[38;5;241m.\u001B[39mcontent[:\u001B[38;5;241m100\u001B[39m]\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m...\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m     43\u001B[0m \u001B[38;5;66;03m# 并发测试 - 修复版本\u001B[39;00m\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\asyncio\\runners.py:33\u001B[0m, in \u001B[0;36mrun\u001B[1;34m(main, debug)\u001B[0m\n\u001B[0;32m      9\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"Execute the coroutine and return the result.\u001B[39;00m\n\u001B[0;32m     10\u001B[0m \n\u001B[0;32m     11\u001B[0m \u001B[38;5;124;03mThis function runs the passed coroutine, taking care of\u001B[39;00m\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m     30\u001B[0m \u001B[38;5;124;03m    asyncio.run(main())\u001B[39;00m\n\u001B[0;32m     31\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m     32\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m events\u001B[38;5;241m.\u001B[39m_get_running_loop() \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[1;32m---> 33\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mRuntimeError\u001B[39;00m(\n\u001B[0;32m     34\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124masyncio.run() cannot be called from a running event loop\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m     36\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m coroutines\u001B[38;5;241m.\u001B[39miscoroutine(main):\n\u001B[0;32m     37\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124ma coroutine was expected, got \u001B[39m\u001B[38;5;132;01m{!r}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(main))\n",
      "\u001B[1;31mRuntimeError\u001B[0m: asyncio.run() cannot be called from a running event loop"
     ]
    }
   ],
   "execution_count": 5
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
